import "reflect-metadata";
import { Request, Response } from "express";
// import { controller, get, post } from "./decorator"; //该引用方式已被弃用
import { controller, get, post } from "../decorator";
import { getResponseData } from "../utils/util";
interface bodyRequest extends Request {
  // bodyRequest 继承了 Request 类型注解以外还增加了自己的属性
  body: {
    // 泛匹配，只要键名为字符串，键值为 string | undefined 都可以
    [key: string]: string | undefined;
  };
}

// 当运行该文件时 ts 会自动收集 @get 装饰器对应的传入的数据（这里面对应的就是 '/login'、'/'），然后进行处理（执行装饰）
// 然后在 @controller 这层装饰器进行处理（执行装饰）
// 装饰器的执行顺序：先执行 @get 装饰器，再执行 @controller 装饰器
// @controller() 函数传入的参数为根路径，最后在实际的类的方法里传方法路径，最终的路径名是两个参数拼接的结果
@controller("/")
export class LoginController {
  static isLogin(req: bodyRequest): boolean {
    return !!(req.session ? req.session.login : false);
  }
  @post("/login")
  login(req: bodyRequest, res: Response): void {
    // 因为在 index.ts 文件内使用了 body-parser 中间件，所以可以直接使用 req.body 请求体信息
    const { password } = req.body;
    // 是否已经登录过标识
    const isLogin = LoginController.isLogin(req);
    if (isLogin) {
      res.json(getResponseData(false, `已经登录过`));
    } else {
      // 类型保护，如果使用了 cookie-session 则存在 req.session，如果 req.session 存在才设置为 true
      if (password === "123" && req.session) {
        req.session.login = true;
        res.json(getResponseData(true));
      } else {
        res.json(getResponseData(false, `登录失败`));
      }
    }
  }
  // @get 装饰器相当于给 logout 方法添加了名为 "path" 值为 "/logout" 的属性
  @get("/logout")
  logout(req: bodyRequest, res: Response): void {
    if (req.session) {
      req.session.login = undefined;
    }
    res.json(getResponseData(true));
  }
  // @get 装饰器相当于给 home 方法添加了名为 "path" 值为 "/" 的属性
  @get("/")
  home(req: bodyRequest, res: Response): void {
    const isLogin = LoginController.isLogin(req);
    if (isLogin) {
      res.send(`
          <html>
            <body>
              <a href="/getData">爬取内容</a>
              <a href="/showData">展示内容</a>
              <a href="/logout">退出</a>
            </body>
          </html>
          `);
    } else {
      res.send(`
          <html>
            <body>
              <form method="post" action="/login">
                <input type="password" name="password" />
                <button>登录</button>
              </form>
            </body>
          </html>
          `);
    }
  }
}
